﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using Caixa.BLL;
using Caixa.Model;
using System.Configuration;

namespace Caixa
{
	public partial class Frm_Consulta : Caixa.Frm_Base
	{
		#region " Constructor "

		public Frm_Consulta()
		{
			InitializeComponent();
		}

		#endregion

		#region " Events "

		private void Frm_Consulta_Load(object sender, EventArgs e)
		{
			if (!CaixaEletronicoBLL.IsLogado)
				this.Close();

			pnlFiltro.Visible = true;
			rtxExtrato.Visible = false;
		}

		private void btnSair_Click(object sender, EventArgs e)
		{
			this.Close();
		}

		private void OpcoesFiltro_CheckedChanged(object sender, EventArgs e)
		{
			if (sender is RadioButton)
			{
				RadioButton rb = (sender as RadioButton);

				pnlFiltroPeriodo.Visible = false;

				DateTime dataFim = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day);
				DateTime dataInicio = dataFim;

				switch (rb.Name)
				{
					case "rb1Dia":
						rtxExtrato.Visible = ProcessarExtrato(dataInicio, dataFim);
						break;
					case "rb3Dias":
						dataInicio = dataInicio.AddDays(-3);
						rtxExtrato.Visible = ProcessarExtrato(dataInicio, dataFim);
						break;
					case "rb7Dias":
						dataInicio = dataInicio.AddDays(-7);
						rtxExtrato.Visible = ProcessarExtrato(dataInicio, dataFim);
						break;
					case "rb15Dias":
						dataInicio = dataInicio.AddDays(-15);
						rtxExtrato.Visible = ProcessarExtrato(dataInicio, dataFim);
						break;
					case "rb30Dias":
						dataInicio = dataInicio.AddDays(-30);
						rtxExtrato.Visible = ProcessarExtrato(dataInicio, dataFim);
						break;
					case "rbPeriodo":
						dtInicio.Text = dataInicio.AddDays(-30).ToString("dd/MM/yyyy");
						dtFim.Text = dataFim.ToString("dd/MM/yyyy");
						pnlFiltroPeriodo.Visible = true;
						break;
					default:
						break;
				}

				pnlFiltro.Visible = !rtxExtrato.Visible;
			}
		}

		private void btnGerarPorPeriodo_Click(object sender, EventArgs e)
		{
			DateTime dataInicio;
			DateTime.TryParse(dtInicio.Text, out dataInicio);
			DateTime dataFim;
			DateTime.TryParse(dtFim.Text, out dataFim);

			rtxExtrato.Visible = ProcessarExtrato(dataInicio, dataFim);
			pnlFiltro.Visible = !rtxExtrato.Visible;
		}

		#endregion

		#region " Methods "

		private bool ProcessarExtrato(DateTime dataInicio, DateTime dataFim)
		{
			bool success = false;

			using (Frm_Processando frm_Processando = new Frm_Processando())
			{
				frm_Processando.Show();
				frm_Processando.Refresh();

				// Chama a geração do extrato
				success = GerarExtrato(dataInicio, dataFim);

				frm_Processando.Close();
			}

			return success;
		}

		private bool GerarExtrato(DateTime dataInicio, DateTime dataFim)
		{
			bool success = false;

			try
			{
				List<string> linhas = new List<string>();

				linhas.Add(string.Empty);

				//Saldo Resumido
				linhas.Add(string.Format("\tSALDO RESUMIDO - {0} às {1}h", DateTime.Now.ToString("dd/MM/yyyy"), DateTime.Now.ToString("HH:mm:ss")));

				// Disponíval para Saque
				linhas.Add(string.Format("\t{0}  {1}",
					CompletaComBrancosDepois("DISPONÍVEL P/ SAQUE", 60),
					CompletaComBrancosAntes(string.Format("{0:n}", CaixaEletronicoBLL.ContaLogada.Saldo), 15)));
				linhas.Add(string.Empty);

				// Cabeçalho
				linhas.Add(string.Format("\tEXTRATO - {0} à {1}", dataInicio.ToString("dd/MM/yyyy"), dataFim.ToString("dd/MM/yyyy")));

				linhas.Add(string.Format("\t{0}", RepeteCaractere('-', 80)));

				linhas.Add(string.Format("\t{0}   {1}  {2}  {3}",
					CompletaComBrancosDepois("Data", 10),
					CompletaComBrancosDepois("Lançamento", 30),
					CompletaComBrancosAntes("Valor (R$)", 15),
					CompletaComBrancosAntes("Saldo (R$)", 15)));

				List<Movimentacao> dataSource = MovimentacaoBLL.GetByPeriodo(CaixaEletronicoBLL.ContaLogada, dataInicio, dataFim);

				if (dataSource.Count > 0)
				{
					Movimentacao mov = dataSource[0];

					linhas.Add(string.Format("\t{0}   {1}  {2}  {3}",
									CompletaComBrancosAntes(dataInicio.ToString("dd/MM/yyyy"), 10),
									CompletaComBrancosDepois("SALDO ANTERIOR", 30),
									CompletaComBrancosAntes("", 15),
									CompletaComBrancosAntes(string.Format("{0:n}", MovimentacaoBLL.GetSaldoAnterior(mov)), 15)));

					DateTime dataAnterior = mov.Data;
					double saldoAnterior = mov.Saldo;
					for (int i = 0; i < dataSource.Count; i++)
					{
						Movimentacao m = dataSource[i];

						// Totaliza o saldo por dia
						if (!dataAnterior.ToString("dd/MM/yyyy").Equals(m.Data.ToString("dd/MM/yyyy")))
						{
							linhas.Add(string.Format("\t{0}   {1}  {2}  {3}",
									CompletaComBrancosAntes(dataAnterior.ToString("dd/MM/yyyy"), 10),
									CompletaComBrancosDepois("SALDO", 30),
									CompletaComBrancosAntes("", 15),
									CompletaComBrancosAntes(string.Format("{0:n}", saldoAnterior), 15)));
						}

						string data = CompletaComBrancosAntes(m.Data.ToString("dd/MM/yyyy"), 10);
						string descricao = CompletaComBrancosDepois(m.Descricao.ToUpper().Substring(0, m.Descricao.Length > 30 ? 30 : m.Descricao.Length), 30);
						string valor = CompletaComBrancosAntes(string.Format("{0:n}", m.Valor * m.Fator), 15);
						string saldo = CompletaComBrancosAntes("", 15);

						string linha = string.Format("\t{0}   {1}  {2}  {3}",
								data,
								descricao,
								valor,
								saldo);

						linhas.Add(linha);

						// Totaliza o saldo por dia
						if (i == dataSource.Count - 1)
						{
							linhas.Add(string.Format("\t{0}   {1}  {2}  {3}",
									CompletaComBrancosAntes(m.Data.ToString("dd/MM/yyyy"), 10),
									CompletaComBrancosDepois("SALDO", 30),
									CompletaComBrancosAntes("", 15),
									CompletaComBrancosAntes(string.Format("{0:n}", m.Saldo), 15)));
						}

						dataAnterior = m.Data;
						saldoAnterior = m.Saldo;
					}
				}

				linhas.Add(string.Format("\t{0}", RepeteCaractere('-', 80)));

				// Disponíval para Saque
				linhas.Add(string.Format("\t{0}  {1}",
					CompletaComBrancosDepois("(=) VALOR TOTAL DISPONIVEL PARA SAQUE", 60),
					CompletaComBrancosAntes(string.Format("{0:n}", CaixaEletronicoBLL.ContaLogada.Saldo), 15)));

				linhas.Add(string.Empty);

				rtxExtrato.Lines = linhas.ToArray();

				success = true;
			}
			catch (Exception e)
			{
				MessageBox.Show(e.Message, "Mensagem", MessageBoxButtons.OK, MessageBoxIcon.Warning);
			}

			return success;
		}

		private string RepeteCaractere(char value, int qtd)
		{
			string str = string.Empty;

			for (int i = 0; i < qtd; i++)
			{
				str += value;
			}

			return str;
		}

		private string CompletaComBrancosDepois(string value, int tam)
		{
			for (int i = value.Length; i < tam; i++)
			{
				value += " ";
			}

			return value;
		}

		private string CompletaComBrancosAntes(string value, int tam)
		{
			for (int i = value.Length; i < tam; i++)
			{
				value = " " + value;
			}

			return value;
		}

		#endregion
	}
}
